package ar.edu.utn.frsf.tpae.a2012.g01.dao.implementacion;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import ar.edu.utn.frsf.tpae.a2012.g01.dao.ClienteDao;
import ar.edu.utn.frsf.tpae.a2012.g01.model.Cliente;

@Component
public class ClienteHibernateDao implements ClienteDao {

	private SessionFactory sessionFactory;

	@Autowired(required = true)
	public void setSessionFactory(SessionFactory session) {
		this.sessionFactory = session;
	}

	@Override
	public Cliente persistir(Cliente cliente) {
		Session session = sessionFactory.getCurrentSession();
		if (cliente.getId() == 0) {
			session.save(cliente);
		} else {
			session.update(cliente);
		}
		return cliente;
	}

	@Override
	public void eliminar(Cliente cliente) {
		Session session = sessionFactory.getCurrentSession();
		session.delete(cliente);
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Cliente> listar() {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("from " + Cliente.class.getName());
		return query.list();
	}

	@Override
	public Cliente buscarPorId(Integer id) {
		Session session = sessionFactory.getCurrentSession();
		return (Cliente) session.get(Cliente.class, id);
	}

	@Override
	public Cliente buscarPorNumero(String numero) {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("from " + Cliente.class.getName()
				+ " where numero = :numero");
		query.setString("numero", numero);
		return (Cliente) query.uniqueResult();
	}

	@Override
	public void actualizar(Cliente cliente) throws Exception {
		Session sesion= sessionFactory.getCurrentSession();
		if (cliente.getId() != 0)
			sesion.update(cliente);
		else
			throw new Exception();
	}

	@Override
	public Integer maximoId() {
		Session session = sessionFactory.getCurrentSession();
		Query query = session.createQuery("select max(c.id) from " + Cliente.class.getName() + " as c");
		Integer resultado = (Integer) query.uniqueResult();		
		if(resultado==null)
			return new Integer(0);
		return resultado;
	}
}
